<!doctype html>
<html lang="zh-cn">
<head>

    <meta charset="utf-8">
    <meta name="generator" content="Hugo 0.57.2" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>第五章 初始化和清除 | The Sky of OtsWang</title>
    <meta property="og:title" content="第五章 初始化和清除 - The Sky of OtsWang">
    <meta property="og:type" content="article">
        
    <meta property="article:published_time" content="2018-11-06T15:37:38&#43;08:00">
        
        
    <meta property="article:modified_time" content="2018-11-06T15:37:38&#43;08:00">
        
    <meta name="Keywords" content="golang,go语言,otswang,java,博客,python">
    <meta name="description" content="第五章 初始化和清除">
        
    <meta name="author" content="OtsWang">
    <meta property="og:url" content="https://otswang.gitee.io/hugo/post/java/thinking_in_java/%E7%AC%AC%E4%BA%94%E7%AB%A0-%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E6%B8%85%E9%99%A4/">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="/hugo/css/normalize.css">
    
        <link rel="stylesheet" href="/hugo/css/prism.css">
    
    <link rel="stylesheet" href="/hugo/css/style.css">
    <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

    


    
    
</head>

<body>
<header id="header" class="clearfix">
    <div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <a id="logo" href="https://otswang.gitee.io/hugo/">
                        The Sky of OtsWang
                    </a>
                
                <p class="description">擅长写HelloWorld的小小码农</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    
                    
                    <a  href="https://otswang.gitee.io/hugo/" title="Home">Home</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/tags/" title="Tags">Tags</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/categories/" title="Categories">Categories</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/archives/" title="Archives">Archives</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/about/" title="About">About</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>


<div id="body">
    <div class="container">
        <div class="col-group">

            <div class="col-8" id="main">
                <div class="res-cons">
                    <article class="post">
                        <header>
                            <h1 class="post-title">第五章 初始化和清除</h1>
                        </header>
                        <date class="post-meta meta-date">
                            2018年11月6日
                        </date>
                        
                        <div class="post-meta">
                            <span>|</span>
                            
                                <span class="meta-category"><a href="https://otswang.gitee.io/hugo/categories/java-thinkinginjava">Java-thinkingInJava</a></span>
                            
                        </div>
                        
                        
                        
                        <div class="post-content">
                            <p>“初始化”和“清除”是造成不安全问题的众多原因中的两个.</p>

<p>程序设计中的“不安全”会造成很严重的后果，比如信息泄漏、运行出错等，“初始化”和“清除”是造成不安全问题的众多原因中的两个。C语言的很多错误是由于初始化造成的，一个变量在声明后没有明确的进行初始化，造成数据的错误。C++引入了“构造器”的概念，使得数据可以得到初始化，Java沿用了这一概念，并在此基础上加入了垃圾收集机制，在资源不使用时自动释放。</p>

<p>构造函数是没有返回值的，而不是说返回值为void。</p>

<p>促使方法重载的因素：
- 方便使用，简化方法名的书写；
- 在构造器中，只能有一个构造器方法名称，但可能有多个不同的构造函数。</p>

<p>重载根据参数类型不同进行区同进行区分，当参数出现出现xs强制类型转换时怎么处理？</p>

<p>可以使用this来调用自身的构造器，但是只能调用一次，如下：</p>

<pre><code class="language-java">public class A{
    private int num;
    private String name;

    A(int num){
        this.num = num;
    }

    A(String name){
        this.name = name;
    }

    A(int num, String name){
        this(num);
        // this(name);	// 错误的使用this
        this.name = name;
    }

}
</code></pre>

<ul>
<li>static *
static 是一个非面向对象的概念，它，它允许在类中存在一个类似全局变量的概念，使得数据不依靠于对象而存在。</li>
</ul>

<h2 id="清除-收尾和垃圾收集">清除： 收尾和垃圾收集</h2>

<p>为提供没有使用<code>new</code>分配的内存地址，采用<code>finalize()</code>方法。在理想情况下，它的工作原理如下：一旦垃圾收集器准备好释放对象占用的空间，首先调用<code>finalize()</code>方法，而且只有在下一次垃圾收集过程中，才会真正回收对象的内存。使用此方法，可以在垃圾收集期间进行一些重要的清除或清扫工作。</p>

<p>有些对象可能不会被当作垃圾收掉。垃圾回收只与内存有关。<code>finalize()</code>只在垃圾回收之前才被调用，而不是C++的析构函数。
<code>finalize()</code>函数是为了在一些固有方法中进行使用的，而C和C++是目前唯一获得固有方法支持的语言。也就是说，此方法的存在是为了使得在Java中调用C风格的语言时，能够将一些需要手动回收的内存方法在此方法中进行调用。因此，在平时的Java编程中应该尽量少使用此方法。</p>

<pre><code class="language-java">/*************************************************************************
    &gt; File Name: Garbage.java
    &gt; Author: otswang
    &gt; Mail: otswang@cqu.edu.cn
    &gt; Created Time: Wed Nov  7 09:04:23 2018
 ************************************************************************/

class Chair{
	static boolean gcrun = false;
	static boolean f = false;
	static int created = 0;
	static int finalized = 0;
	
	int i;
	Chair(){
		i = ++ created;
		if(created == 47){
			System.out.println(&quot;Created 47&quot;);
		}
	}

	protected void finalize(){
		if(!gcrun){
			gcrun = true;
			System.out.println(&quot;Beginning to finalize after &quot;+created+&quot; Chairs have been created&quot;);
		}

		if(i == 47){
			System.out.println(&quot;Finalizing chair # &quot; + i + &quot;, setting flag to stop chair creation &quot;);
			f = true;
		}

		finalized ++;
		
		if(finalized &gt;= created){
			System.out.println(&quot;all &quot; + finalized + &quot; finalized&quot;);
		}
	}
}

public class Garbage {
	public static void main(String[] args) {
		if (args.length == 0) {
			System.out.println(&quot;Usage : \n&quot; + 
					&quot;java Garbage before\n or: \n&quot; + 
					&quot;java Garbage after&quot;);
			return ;
		}

		while(!Chair.f){
			new Chair();
			new String(&quot;To take up space&quot;);
		}

		System.out.println(&quot;after all chairs have been created:\n&quot; +
				&quot;total created &quot; + Chair.created + &quot; chairs, and total finalized &quot; + 
				Chair.finalized);

		if(args[0].equals(&quot;before&quot;)) {
			System.out.println(&quot;gc():&quot;);
			System.gc();
			System.out.println(&quot;runFinalization():&quot;);
			System.runFinalization();
		}
		System.out.println(&quot;bye&quot;);
		if(args[0].equals(&quot;after&quot;)) {
			System.runFinalizersOnExit(true);

		}
	}
}
</code></pre>

<h2 id="成员初始化">成员初始化</h2>

<p>局部变量不会被初始化，当无初始化时会出现编译器错误，而类内部的基本数据成员都会被保证获得一个初始值。</p>

<p>在一个类中，变量初始化顺序是由变量定义的顺序决定的。而<code>static</code>变量是在类创建、或引用<code>static</code>变量时才进行创建初始化，此后不再初始化。</p>

<p>书中的总结（考虑一个名为<code>Dog</code>的类）：
- 类型为Dog的第一个对象首次创建时，或者Dog类的static方法/字段首次访问时，Java解释器必需找到Dog.class.
- 找到Dog.class后（此时会创建一个class对象），它的所有static初始化模块都会运行，因此，static初始化仅发生一次，在Class对象首次载入的时候。
- 创建一个<code>new Dog()</code>时，Dog对象的构建进程首先会在内存堆Heap里为一个Dog对象分配足够多的存储空间。
- 这种存储空间会清为零，将Dog中的所有基本类型设置为它们的默认值。
- 进行字段定义时发生的所有初始化都会执行。
- 执行构造器</p>

<p><code>static</code>构建从句与static变量一样的处理方式。
非静态实例的初始化与上面一致。</p>

<pre><code class="language-java">class Dog {
    Dog(int i) {
        System.out.println(&quot;Dog &quot; + i);
    }

    void foo(int i) {
        System.out.println(&quot;foo(&quot; + i + &quot;)&quot;);
    }
}

class Dogs {
    /* static */ Dog dog1;
    /* static */ Dog dog2;

    /* static */ {
        dog1 = new Dog(1);
        dog2 = new Dog(2);
        System.out.println(&quot;dog 1 and dog 2&quot;);
    }

    Dogs() {
        System.out.println(&quot;Dogs()&quot;);
    }
}

public class Test2 {
    public static void main(String[] args) {
        System.out.print(&quot;start \n&quot;);
        // Dogs.dog1.foo(137);
        Dogs dogs = new Dogs();
        Dogs dogs2 = new Dogs();
    }

    // static Dogs x = new Dogs();
    // static Dogs y = new Dogs();
}
</code></pre>

<p><em>此处需要再理解</em></p>

<h2 id="数组的初始化">数组的初始化</h2>

<p>编译器不允许我们告诉它一个数组有多大，这样便回到了引用的问题上。</p>
                        </div>

                        


                        

<div class="post-archive">
    <h2>See Also</h2>
    <ul class="listing">
        
        <li><a href="/hugo/post/java/thinking_in_java/%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E6%8E%A7%E5%88%B6%E7%A8%8B%E5%BA%8F%E6%B5%81%E7%A8%8B/">第四章 控制程序流程</a></li>
        
        <li><a href="/hugo/post/java/thinking_in_java/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E4%B8%80%E5%88%87%E7%9A%86%E5%AF%B9%E8%B1%A1/">第二章 一切皆对象</a></li>
        
        <li><a href="/hugo/post/java/thinking_in_java/%E7%AC%AC%E4%B8%80%E7%AB%A0-%E5%AF%B9%E8%B1%A1%E5%85%A5%E9%97%A8/">第一章 对象入门</a></li>
        
        <li><a href="/hugo/post/java/advance_features/">Java高级特性概览</a></li>
        
        <li><a href="/hugo/post/design/general/">泛型</a></li>
        
    </ul>
</div>


                        <div class="post-meta meta-tags">
                            
                            <ul class="clearfix">
                                
                                <li><a href="https://otswang.gitee.io/hugo/tags/java">Java</a></li>
                                
                            </ul>
                            
                        </div>
                    </article>
                    
    

    
    
                </div>
            </div>
            <div id="secondary">

    <section class="widget">
        <form id="search" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="https://otswang.gitee.io/hugo/">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">最近文章</h3>
<ul class="widget-list">
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/middle_tools/kafka/" title="Kafka">Kafka</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/middle_tools/zk_starter/" title="Zookeeper Starter">Zookeeper Starter</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/java/javafx_starter/" title="Java Fx 入门学习">Java Fx 入门学习</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/codec/" title="常用加密/签名算法">常用加密/签名算法</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/docker/" title="Docker学习">Docker学习</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/webapp/react_starter/" title="React 从入门到入门">React 从入门到入门</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/lang/csharpe_starter/" title="C#语言从入门到入门">C#语言从入门到入门</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/java/java8time/" title="Java checklist">Java checklist</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/keyboard/" title="快捷键记录">快捷键记录</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/post/other/vim/" title="vim 使用记录">vim 使用记录</a>
    </li>
    
</ul>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">分类</h3>
<ul class="widget-list">
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/algorithm/">algorithm(4)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/design/">design(7)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/doc/">doc(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/go/">go(3)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java/">java(7)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-java8inaction/">java-java8inaction(11)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-juc/">java-juc(3)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-jvm/">java-jvm(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-spring/">java-spring(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/java-thinkinginjava/">java-thinkinginjava(11)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/middletools/">middletools(9)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/other/">other(24)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/qt/">qt(2)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/smallquickappweb/">smallquickappweb(4)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/webapp/">webapp(1)</a>
    </li>
    
    <li>
        <a href="https://otswang.gitee.io/hugo/categories/%E5%B0%8F%E4%BC%97%E8%AF%AD%E8%A8%80%E4%B8%80%E7%9E%A5/">小众语言一瞥(4)</a>
    </li>
    
</ul>
    </section>

    <section class="widget">
        <h3 class="widget-title">标签</h3>
<div class="tagcloud">
    
    <a href="https://otswang.gitee.io/hugo/tags/c/">c#</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/checklist/">checklist</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/codec/">codec</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/docker/">docker</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/elk/">elk</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/emmet/">emmet</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/file/">file</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/freemarker/">freemarker</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/git/">git</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/go/">go</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/http/">http</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/interview/">interview</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/java/">java</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/javascript/">javascript</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/juc/">juc</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/jvm/">jvm</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/keyboard/">keyboard</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/linux/">linux</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/lua/">lua</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/manjaro/">manjaro</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/map/">map</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/markdown/">markdown</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mq/">mq</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mybatis/">mybatis</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mycat/">mycat</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/mysql/">mysql</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/nginx/">nginx</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/qt/">qt</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/react/">react</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/redis/">redis</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/rust/">rust</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/spring/">spring</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/springboot/">springboot</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/stream/">stream</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/tcp/">tcp</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/thymeleaf/">thymeleaf</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/tree/">tree</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/uml/">uml</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/vim/">vim</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/vlang/">vlang</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/vue/">vue</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/zookeeper/">zookeeper</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E4%BD%8D%E8%BF%90%E7%AE%97/">位运算</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%8D%8F%E8%AE%AE/">协议</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/">多线程</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%B9%B6%E5%8F%91%E9%9B%86%E5%90%88/">并发集合</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/">微信小程序</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E5%BF%AB%E5%BA%94%E7%94%A8/">快应用</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E6%97%B6%E9%97%B4%E7%B1%BB/">时间类</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E6%A8%A1%E6%9D%BF%E5%BC%95%E6%93%8E/">模板引擎</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E7%AE%97%E6%B3%95/">算法</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E7%BC%96%E7%A8%8B/">编程</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83/">编程规范</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E8%AE%BE%E8%AE%A1/">设计</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E9%99%90%E6%B5%81/">限流</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/">面向对象</a>
    
    <a href="https://otswang.gitee.io/hugo/tags/%E9%9D%A2%E8%AF%95/">面试</a>
    
</div>
    </section>

    

    <section class="widget">
        <h3 class="widget-title">其它</h3>
        <ul class="widget-list">
            <li><a href="https://otswang.gitee.io/hugo/index.xml">文章 RSS</a></li>
        </ul>
    </section>

    

</div>
        </div>
    </div>
</div>
<footer id="footer">
    <div class="container">
        &copy; 2020 <a href="https://otswang.gitee.io/hugo/">The Sky of OtsWang By OtsWang</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="https://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/Dudiao137/maupassant-hugo" target="_blank">maupassant-ots</a>.
        
    </div>
</footer>


    <script type="text/javascript">
    
    (function(){
        $("pre code").parent().addClass("line-numbers")
    }())

    window.MathJax = {
        tex2jax: {
            inlineMath: [ ['$','$'] ],
            processEscapes: true
        }
    };
    </script>
    <script type="text/javascript" src="/hugo/js/prism.js" async="true"></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' async></script>

<a id="rocket" href="#top"></a>
<script type="text/javascript" src="/hugo/js/totop.js?v=0.0.0" async=""></script>







 
 <script src="https://mermaidjs.github.io/scripts/mermaid.min.js"></script>
 <script>
       mermaid.initialize({ startOnLoad: true });
 </script>
</body>
</html>
